#ifndef POINT_H
#define POINT_H

/**
 * \file Point.h
 * \brief Fichier contenant la déclaration de la classe Point
 */

class Point
{

	/* \class Point
	 * \brief Classe représentant un point du nuage de points acquis par lidar terrestre. Notament ses coordonnées et sa couleur.
	 */

  private :

        float X;															/*!<Abscisse du point.*/
        float Y;															/*!<Ordonnée du point.*/
        float Z;															/*!<Hauteur du point.*/

		float R;															/*!<Intensité du canal rouge du point.*/
        float G;															/*!<Intensité du canal vert du point.*/
        float B;															/*!<Intensité du canal bleu du point.*/

  public :

		/*!
     	*  \brief Constructeur de la classe Point
     	*
     	*  Constructeur de la classe Point
     	*/
        Point(void);

		/*!
		 *  \brief Constructeur de la classe Point
		 *
		 *  Constructeur de la classe Point
		 *
		 *  \param _x : Abcsisse du point à créer.
		 *  \param _y : Ordonnée du point à créer.
		 *  \param _z : Hauteur du point à créer.
		 *  \param _r : Intensité du canal rouge du point à créer.
		 *  \param _g : Intensité du canal vert du point à créer.
		 *  \param _b : Intensité du canal bleu du point à créer.
    	*/
        Point(float _x, float _y, float _z, float _r, float _g, float _b);

		/*!
  		 *  \brief Constructeur de la classe Point
		 *
    	 *  Constructeur de la classe Point
		 *
		 *  \param _p : Le point ainsi créer sera un doublon du point _p.
    	*/
        Point(const Point & _p);

		/*!
  		 *  \brief Destructeur de la classe Point
		 *
    	 *  Destructeur de la classe Point
    	*/
        ~Point();


		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de l'abscisse de la classe Point
		 *
		 *  \param _x : Affecte _x à l'abscisse du point.
		 *
		 *  \return : void
    	*/
        void setX(float _x);

		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de l'ordonnée de la classe Point
		 *
		 *  \param _y : Affecte _y à l'ordonnée du point.
		 *
		 *  \return : void
    	*/
        void setY(float _y);

		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la hauteur de la classe Point
		 *
		 *  \param _z : Affecte _z à la hauteur du point.
		 *
		 *  \return : void
    	*/
        void setZ(float _z);

		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la classe Point
		 *
		 *  \param _x : Affecte _x à l'abscisse du point.
		 *  \param _y : Affecte _y à l'ordonnée du point.
		 *  \param _z : Affecte _z à la hauteur du point.
		 *
		 *  \return : void
    	*/
		void setXYZ(float _x, float _y, float _z);


		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la classe Point
		 *
		 *  \param _r : Affecte _r à l'intensité du canal rouge du point.
		 *
		 *  \return : void
    	*/	
		void setR(float _r);

		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la classe Point
		 *
		 *  \param _g : Affecte _g à l'intensité du canal vert du point.
		 *
		 *  \return : void
    	*/	
        void setG(float _g);
        
		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la classe Point
		 *		
		 *  \param _b : Affecte _b à l'intensité du canal bleu du point.
		 *
		 *  \return : void
    	*/	
		void setB(float _b);

		/*!
  		 *  \brief Modificateur de la classe Point
		 *
    	 *  Modificateur de la classe Point
		 *
		 *  \param _r : Affecte _r à l'intensité du canal rouge du point.
		 *  \param _g : Affecte _g à l'intensité du canal vert du point.
		 *  \param _b : Affecte _b à l'intensité du canal bleu du point.
		 *
		 *  \return : void
    	*/		
		void setRGB(float _r, float _g, float _b);
       

		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de l'abscisse de la classe Point
		 *	
		 *	\return : Renvoie l'abcsisse du point.
    	*/	
        float getX(void);
        
		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de l'ordonnée de la classe Point
		 *	
		 *	\return : Renvoie l'ordonnée du point.
    	*/	
		float getY(void);

		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de la hauteur de la classe Point
		 *	
		 *	\return : Renvoie la hauteur du point.
    	*/	
        float getZ(void);

		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de la couleur de la classe Point
		 *	
		 *	\return : Renvoie l'intensité du canal rouge du point.
    	*/	
		float getR(void);

		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de la couleur de la classe Point
		 *	
		 *	\return : Renvoie l'intensité du canal vert du point.
    	*/	
        float getG(void);

		/*!
  		 *  \brief Accesseur de la classe Point
		 *
    	 *  Accesseur de la couleur de la classe Point
		 *	
		 *	\return : Renvoie l'intensité du canal bleu du point.
    	*/	
        float getB(void);


		/*!
  		 *  \brief Affiche dans la console les coordonnées (x,y,z) du point.
		 *
    	 *  Affiche dans la console les coordonnées (x,y,z) du point. Utile pour les tests.
		 *
		 *  \return : void
    	*/	
		void printPoint();

		/*!
  		 *  \brief Surcharge de d'opérateur.
		 *
    	 *  Surcharge de l'opérateur =.
		 *
		 *  \param _p : Point à copier.
		 *
		 *  \return : Point
    	*/
        Point &operator= (const Point &_p);

		/*!
  		 *  \brief Surcharge de d'opérateur.
		 *
    	 *  Surcharge de l'opérateur ==.
		 *
		 *  \param _p : Point avec lequel tester l'égalité.
		 *
		 *  \return : bool
    	*/
        bool operator== (const Point & _p);

		/*!
  		 *  \brief Surcharge de d'opérateur.
		 *
    	 *  Surcharge de l'opérateur !=.
		 *
		 *  \param _p : Point avec lequel tester l'égalité.
		 *
		 *  \return : bool
    	*/
		bool operator!= (const Point & _p);

};

#endif
